﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    /// <summary>
    /// REGISTRO A100: DOCUMENTO - NOTA FISCAL DE SERVIÇO
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.RegA100")]
    [ComVisible(true)]
    public class RegA100 : IBloco
    {
        /// <summary>
        /// Indicador do tipo de operação:
        ///     0 - Serviço Contratado pelo Estabelecimento;
        ///     1 - Serviço Prestado pelo Estabelecimento.
        /// </summary>
        public string IND_OPER { get; set; }
        /// <summary>
        /// Indicador do emitente do documento fiscal:
        ///     0 - Emissão própria;
        ///     1 - Emissão de Terceiros
        /// </summary>
        public string IND_EMIT { get; set; }
        /// <summary>
        /// Código do participante (campo 02 do Registro 0150):
        ///     - do emitente do documento, no caso de emissão de terceiros;
        ///     - do adquirente, no caso de serviços prestados.
        /// </summary>
        public string COD_PART { get; set; }
        /// <summary>
        /// Código da situação do documento fiscal:
        ///     00 – Documento regular
        ///     02 – Documento cancelado
        /// </summary>
        public string COD_SIT { get; set; }
        /// <summary>
        /// Série do documento fiscal
        /// </summary>
        public string SER { get; set; }
        /// <summary>
        /// Subsérie do documento fiscal
        /// </summary>
        public string SUB { get; set; }
        /// <summary>
        /// Número do documento fiscal ou documento internacional equivalente
        /// </summary>
        public string NUM_DOC { get; set; }
        /// <summary>
        /// Chave/Código de Verificação da nota fiscal de serviço eletrônica
        /// </summary>
        public string CHV_NFSE { get; set; }
        /// <summary>
        /// Data da emissão do documento fiscal
        /// </summary>
        public DateTime DT_DOC { get; set; }
        /// <summary>
        /// Data de Execução / Conclusão do Serviço
        /// </summary>
        public DateTime DT_EXE_SERV { get; set; }
        /// <summary>
        /// Valor total do documento
        /// </summary>
        public double VL_DOC { get; set; }
        /// <summary>
        /// Indicador do tipo de pagamento:
        ///     0- À vista;
        ///     1- A prazo;
        ///     9- Sem pagamento
        /// </summary>
        public string IND_PGTO { get; set; }
        /// <summary>
        /// Valor total do desconto
        /// </summary>
        public double VL_DESC { get; set; }
        /// <summary>
        /// Valor da base de cálculo do PIS/PASEP
        /// </summary>
        public double VL_BC_PIS { get; set; }
        /// <summary>
        /// Valor total do PIS
        /// </summary>
        public double VL_PIS { get; set; }
        /// <summary>
        /// Valor da base de cálculo da COFINS
        /// </summary>
        public double VL_BC_COFINS { get; set; }
        /// <summary>
        /// Valor total da COFINS
        /// </summary>
        public double VL_COFINS { get; set; }
        /// <summary>
        /// Valor total do PIS retido na fonte
        /// </summary>
        public double VL_PIS_RET { get; set; }
        /// <summary>
        /// Valor total da COFINS retido na fonte
        /// </summary>
        public double VL_COFINS_RET { get; set; }
        /// <summary>
        /// Valor do ISS
        /// </summary>
        public double VL_ISS { get; set; }
        /// <summary>
        /// Armazena os Registros A120 Filhos
        /// </summary>
        public List<RegA120> RegistroA120 = new List<RegA120>();
        public List<RegA170> RegistroA170 = new List<RegA170>();

        /// <summary>
        /// Adiciona os Registros Filhos
        /// </summary>
        /// <param name="Reg"></param>
        public void AdicionaReg(IBloco Reg)
        {
            if (Reg is RegA120)
                this.RegistroA120.Add((RegA120)Reg);
            if (Reg is RegA170)
                this.RegistroA170.Add((RegA170)Reg);
        }

        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.IND_OPER) || !this.IND_OPER.StringIN("0-1"))
            {
                Erro += "\r\n* Registro A100 - Indicador do tipo de operação inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_EMIT) || !this.IND_EMIT.StringIN("0-1"))
            {
                Erro += "\r\n* Registro A100 - Indicador do emitente do documento fiscal inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_PART))
            {
                this.COD_PART = string.Empty;
                Erro += "\r\n* Registro A100 - Código do Participante não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_SIT) || !this.IND_EMIT.StringIN("00-02"))
            {
                Erro += "\r\n* Registro A100 - Indicador do emitente do documento fiscal inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.NUM_DOC))
            {
                this.NUM_DOC = string.Empty;
                Erro += "\r\n* Registro A100 - Número do Documento não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_PGTO) || !this.IND_PGTO.StringIN("0-1-9"))
            {
                Erro += "\r\n* Registro A100 - Indicador do tipo de pagamento inválido.";
                ValidacaoOK = false;
            }            

            if (string.IsNullOrEmpty(this.IND_OPER))
                this.IND_OPER = string.Empty;

            if (string.IsNullOrEmpty(this.IND_EMIT))
                this.IND_EMIT = string.Empty;

            if (string.IsNullOrEmpty(this.COD_SIT))
                this.COD_SIT = string.Empty;

            if (string.IsNullOrEmpty(this.CHV_NFSE))
                this.CHV_NFSE = string.Empty;

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "A100" + this.Delimitador;
            Linha += this.IND_OPER.Trim() + this.Delimitador;
            Linha += this.IND_EMIT.Trim() + this.Delimitador;
            Linha += this.COD_PART.Trim() + this.Delimitador;
            Linha += this.COD_SIT.Trim() + this.Delimitador;
            Linha += this.SER.Trim() + this.Delimitador;
            Linha += this.SUB.Trim() + this.Delimitador;
            Linha += this.NUM_DOC.Trim() + this.Delimitador;
            Linha += this.CHV_NFSE.Trim() + this.Delimitador;
            Linha += this.DT_DOC.FormatoDataSped() + this.Delimitador;
            Linha += this.DT_EXE_SERV.FormatoDataSped() + this.Delimitador;
            Linha += this.VL_DOC.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.IND_PGTO.Trim() + this.Delimitador;
            Linha += this.VL_DESC.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_BC_PIS.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_PIS.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_BC_COFINS.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_COFINS.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_PIS_RET.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_COFINS_RET.FormatoValorSped(2) + this.Delimitador;
            Linha += this.VL_ISS.FormatoValorSped(2) + this.Delimitador;

            return Linha.Trim();
        }
    }
}
